package com.hww.common.util;

import android.util.Log;

import java.net.NetworkInterface;
import java.util.Collections;
import java.util.List;

/**
 * @author hww
 * @date 2019-07-04.
 * email：
 * description： Mac工具类
 */
public class MacUtil {

    private static final String NETWORK_WLAN = "wlan0";
    private static final String NETWORK_ETH = "eth0";
    public static final String DEFAULT_MAC = "02:00:00:00:00:00";

    /**
     * 正则表达式用于验证MAC地址格式,支持通过 : - . 进行分割的格式
     */
    private static final String MAC_PATTERN = "^([0-9A-Fa-f]{2}[\\:\\-\\.]){5}([0-9A-Fa-f]{2})$";

    /**
     * 检查给定的字符串是否为有效的MAC地址。
     * <p>
     * MAC地址由六对十六进制数字组成，每对之间用冒号（:）或破折号（-）分隔。
     * 本方法使用正则表达式来验证输入字符串是否符合MAC地址的标准格式。
     *
     * @param macAddress 待验证的MAC地址字符串。
     * @return 如果输入字符串是有效的MAC地址，则返回true；否则返回false。
     */
    public static boolean isValidMacAddress(String macAddress) {
        return macAddress.matches(MAC_PATTERN);
    }

    /**
     * 获取MAC,先获取wifi，失败后在获取以太网 返回String
     *
     * @return
     */
    public static String getMAC() {
        String mac;
        mac = getMacAddress(NETWORK_WLAN);
        if (null == mac) {
            mac = getMacAddress(NETWORK_ETH);
        }
        if (null == mac) {
            mac = DEFAULT_MAC;
        }
        return mac;
    }

    /**
     * 获取MAC,先获取wifi，失败后在获取以太网 返回Byte
     *
     * @return
     */
    public static byte[] getMACByte() {
        byte[] mac;
        mac = getMacAddressByte(NETWORK_WLAN);
        if (null == mac) {
            mac = getMacAddressByte(NETWORK_ETH);
        }
        if (null == mac) {
            mac = new byte[6];
        }
        return mac;
    }

    /**
     * 获取MAC
     *
     * @param netWork
     * @return
     */
    private static String getMacAddress(String netWork) {
        try {
            List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces());
            for (NetworkInterface ntwInterface : interfaces) {

                //之前是p2p0，修正为wlan   wlan0  eth0
                if (ntwInterface.getName().equalsIgnoreCase(netWork)) {
                    byte[] byteMac = ntwInterface.getHardwareAddress();
                    if (byteMac == null) {
                        // return null;
                    }
                    StringBuilder strBuilder = new StringBuilder();
                    for (int i = 0; i < byteMac.length; i++) {
                        strBuilder.append(String.format("%02X:", byteMac[i]));
                    }
                    if (strBuilder.length() > 0) {
                        strBuilder.deleteCharAt(strBuilder.length() - 1);
                    }
                    return strBuilder.toString();
                }
            }
        } catch (Exception e) {
            Log.d("hww", e.getMessage());
        }
        return null;
    }


    /**
     * 获取指定网络接口的MAC地址字节数组。
     *
     * @param netWork 指定网络接口的名称。
     * @return 如果找到指定接口并获取到MAC地址，则返回MAC地址的字节数组；否则返回null。
     */
    private static byte[] getMacAddressByte(String netWork) {
        try {
            /*列出所有可用的网络接口*/
            List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces());
            for (NetworkInterface ntwInterface : interfaces) {
                /*检查当前网络接口是否与指定名称匹配*/
                if (ntwInterface.getName().equalsIgnoreCase(netWork)) {
                    /*尝试获取当前网络接口的硬件地址（MAC地址）*/
                    byte[] byteMac = ntwInterface.getHardwareAddress();
                    if (null != byteMac) {
                        return byteMac;
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }


    /**
     * 获取指定网络接口的格式化MAC地址字符串。
     *
     * @param netWork 网络接口名，例如"eth0"或"wlan0"，用于标识要获取MAC地址的网络设备。
     * @return 格式化的MAC地址字符串，形如"00:11:22:33:44:55"；如果无法获取到MAC地址或者输入为空，则返回空字符串。
     */
    public static String getMacFormat(String netWork) {
        byte[] macAddressByte = getMacAddressByte(netWork);
        if (null == macAddressByte || 0 == macAddressByte.length) {
            return "";
        }
        String s = ConvertUtils.bytes2HexString(macAddressByte);
        return formatMacAddress(s);
    }

    /**
     * 格式化MAC地址。
     * <p>
     * 本函数旨在将MAC地址字符串格式化为标准的六组两位十六进制数，每组之间用冒号分隔的形式。
     * 如果输入的字符串不包含有效的MAC地址格式，则原样返回。
     *
     * @param macAddress 待格式化的MAC地址字符串。
     * @return 格式化后的MAC地址字符串，如果输入无效则返回原字符串。
     */
    public static String formatMacAddress(String macAddress) {
        // 去除可能包含的非法字符（非十六进制字符）
        macAddress = macAddress.replaceAll("[^A-Fa-f0-9]", "");
        // 校验 MAC 地址的长度，通常应为12个字符
        if (macAddress.length() != 12) {
            // 可以根据实际需求处理长度不正确的情况，这里简单返回原始输入
            return macAddress;
        }
        // 将 MAC 地址格式化为标准格式 XX:XX:XX:XX:XX:XX
        StringBuilder formattedMac = new StringBuilder();
        for (int i = 0; i < 12; i += 2) {
            if (i > 0) {
                formattedMac.append(":");
            }
            formattedMac.append(macAddress.substring(i, i + 2));
        }
        return formattedMac.toString().toUpperCase(); // 转换为大写形式
    }


    /**
     * 移除Mac地址中的格式化字符。
     * 该方法用于处理Mac地址字符串，移除其中的冒号、短横线和点号，以获得纯数字和字母组成的Mac地址。
     *
     * @param formattedMac 一个格式化的Mac地址字符串，例如"01:23:45:67:89:AB"或"01-23-45-67-89-AB"。
     * @return 返回移除格式化字符后的Mac地址字符串，例如"0123456789AB"。
     */
    public static String removeMacFormat(String formattedMac) {
        return formattedMac.replaceAll("[\\:\\-\\.]", "");
    }

}
